1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <cstdio> #include <algorithm> #define LS(cur) a[a[cur].ls] #define RS(cur) a[a[cur].rs] using namespace std; const int maxn = 2e5 + 5; struct T{ struct A{ int l, r, ls, rs, v; }a[maxn * 40]; int tot; T(){tot = 1;} void build(int cur, int l, int r){ a[cur].l = l, a[cur].r = r; if (l == r) return; int mid = l + r >> 1; build(a[cur].ls = ++tot, l, mid); build(a[cur].rs = ++tot, mid + 1, r); } int upd(int t, int p){ int mid = a[t].l + a[t].r >> 1, cur; a[cur = ++tot] = a[t]; a[cur].v++; if (a[t].l == a[t].r) return cur; if (p <= mid) a[cur].ls = upd(a[t].ls, p); else a[cur].rs = upd(a[t].rs, p); a[cur].v = LS(cur).v + RS(cur).v; return cur; } int Query(int u, int v, int k){ if (a[u].l == a[u].r) return a[u].l; if (LS(v).v - LS(u).v >= k) return Query(a[u].ls, a[v].ls, k); else return Query(a[u].rs, a[v].rs, k - (LS(v).v - LS(u).v)); } }t; int n, Q, a[maxn], tt[maxn], link[maxn], rt[maxn]; int main(){ scanf("%d%d", &n, &Q); for (int i = 1; i <= n; i++) scanf("%d", a + i), tt[i] = a[i]; sort(tt + 1, tt + n + 1); t.build(1, 1, n); rt[0] = 1; for (int i = 1; i <= n; i++){ int tmp = lower_bound(tt + 1, tt + n + 1, a[i]) - tt; link[tmp] = a[i]; a[i] = tmp; rt[i] = t.upd(rt[i - 1], a[i]); } while (Q--){ int l, r, k; scanf("%d%d%d", &l, &r, &k); printf("%d\n", link[t.Query(rt[l - 1], rt[r], k)]); } return 0; }
|